package com.air.controller.passenger;


import com.air.dto.PassengerTicketPageQueryDTO;
import com.air.dto.TicketDTO;
import com.air.result.PageResult;
import com.air.result.Result;
import com.air.service.TicketService;
import com.air.vo.TicketVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 乘客票务控制器
 * 该控制器负责处理与乘客票务相关的所有HTTP请求，提供机票查询、预订等接口。
 * 使用@RestController注解标识这是一个RESTful API控制器，@RequestMapping注解用于定义控制器处理的URL路径。
 * @Api注解用于文档化，标识这个类是API的一部分，@ApiTags注解用于指定API的标签，便于分类和检索。
 */
@RestController("passengerTicketController")
@RequestMapping("/passenger/ticket")
@Slf4j
@Api(tags = "机票相关接口")
public class TicketController {

    @Autowired
    private TicketService ticketService; // 注入TicketService


    /**
     * 分页查询机票信息的接口。
     *
     * 通过接收PassengerTicketPageQueryDTO对象作为查询条件，实现对机票数据的分页查询。
     * 查询结果以PageResult对象的形式返回，其中包含了分页信息和查询到的机票数据。
     *
     * @param passengerTicketPageQueryDTO 查询条件对象，包含了分页信息和机票查询条件。
     * @return 返回查询结果的封装对象，包含分页信息和查询到的机票数据。
     */
    @GetMapping("/page")
    @ApiOperation("分页查询机票")
    public Result<PageResult> PageQuery(PassengerTicketPageQueryDTO passengerTicketPageQueryDTO) {
        // 调用票务服务的分页查询方法，根据乘客信息查询机票
        PageResult pageResult = ticketService.pageQueryByPassenger(passengerTicketPageQueryDTO);
        // 将查询结果封装成成功结果并返回
        return Result.success(pageResult);
    }

    /**
     * 根据机票ID查询详细的机票信息。
     *
     * 本方法通过GET请求方式，结合Spring MVC的@PathVariable注解，从URL路径中提取机票ID，
     * 并以此查询机票信息。使用@ApiOperation注解来说明该方法的API功能。
     *
     * @param id 机票的唯一标识ID，用于查询特定机票的信息。
     * @return 返回查询结果的封装对象，包含机票的详细信息。如果查询成功，返回包含机票信息的Result对象；
     *         如果查询失败或ID无效，则返回相应的错误信息。
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询机票")
    public Result<TicketVO> getById(@PathVariable Long id) {
        // 记录查询操作的日志信息，包括查询的机票ID。
        log.info("根据id查询机票:{}", id);

        // 调用ticketService服务，根据ID查询机票信息，并将结果返回。
        TicketVO ticketVO = ticketService.getById(id);
        return Result.success(ticketVO);
    }


    /**
     * 购买机票的接口。
     * 通过此接口，可以实现对机票的购买操作。请求体中包含机票的相关信息，接口调用成功后，会触发机票购买流程。
     *
     * @param ticketDTO 包含机票购买信息的数据传输对象，包括但不限于航班号、乘客信息等。
     * @return 返回操作结果，通常表示购买操作是否成功。
     */
    @PutMapping
    @ApiOperation("购买机票")
    public Result purchase(@RequestBody TicketDTO ticketDTO) {
        // 调用票务服务完成机票购买操作。
        ticketService.purchase(ticketDTO);
        // 返回操作成功的结果。
        return Result.success();
    }


    /**
     * 处理退票请求。
     *
     * 本方法通过PUT请求路径“/refund/{id}”接收退票操作。其中{id}是门票的唯一标识符。
     * 使用@PutMapping注解指定请求的方法类型为PUT，并通过@PathVariable注解将{id}绑定到方法参数id上。
     *
     * @param id 代表待退票的门票的唯一标识符。
     * @return 返回一个Result对象，表示退票操作的结果。如果退票成功，Result对象中的success方法将返回true。
     */
    @PutMapping("/refund/{id}")
    @ApiOperation("退票")
    public Result refund(@PathVariable Long id) {
        // 调用退款服务，处理指定订单的退款事宜
        ticketService.refund(id);
        // 返回操作成功的结果反馈
        return Result.success();

    }
}
